package com.zxjbyte.yiyi.framework.quartz.trigger.route;

import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;

/**
 * 简单触发器
 * SimpleTrigger用于在指定的时间点触发任务执行。你可以指定触发的间隔时间和重复次数。一旦设置的触发条件满足，任务就会被执行。
 *
 * @Author zhangxingjia
 * @Date 2023/10/8 15:34
 * @Version: 1.0
 */
public class SimpleTriggerHelper {

    /**
     * 创建一个简单的触发器，指定重复次数和间隔时间（单位：秒）
     * @param repeatCount 重复次数
     * @param intervalInSeconds 重复调度间隔时间（单位：秒）
     * @return
     */
    public static SimpleScheduleBuilder simpleSchedule(int repeatCount, int intervalInSeconds){
        return SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(intervalInSeconds)
                .withRepeatCount(repeatCount);
    }

    /**
     * 创建一个简单的触发器，指定重复次数和间隔时间（单位：秒）
     * @param repeatCount 重复次数
     * @param intervalInSeconds 重复调度间隔时间（单位：秒）
     * @param misfireInstruction 哑火策略
     * @return
     */
    public static SimpleScheduleBuilder simpleSchedule(int repeatCount, int intervalInSeconds, int misfireInstruction){
        SimpleScheduleBuilder simpleSchedule = simpleSchedule(repeatCount, intervalInSeconds);
        misfirePolicy(simpleSchedule, misfireInstruction);
        return simpleSchedule;
    }

    /**
     * 创建一个简单的触发器，指定重复次数和间隔时间（单位：分钟）
     * @param repeatCount 重复次数
     * @param intervalInMinutes 重复调度间隔时间（单位：分钟）
     * @return
     */
    public static SimpleScheduleBuilder simpleScheduleInMinutes(int repeatCount, int intervalInMinutes) {
        return SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInMinutes(intervalInMinutes)
                .withRepeatCount(repeatCount);
    }

    /**
     * 创建一个简单的触发器，指定重复次数和间隔时间（单位：小时）
     * @param repeatCount 重复次数
     * @param intervalInHours 重复调度间隔时间（单位：小时）
     * @return
     */
    public static SimpleScheduleBuilder simpleScheduleInHours(int repeatCount, int intervalInHours) {
        return SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInHours(intervalInHours)
                .withRepeatCount(repeatCount);
    }

    /**
     * 创建一个只触发一次的简单触发器，指定延迟时间（单位：秒）
     * @param delayInSeconds 延迟时间（单位：秒）
     * @return
     */
    public static SimpleScheduleBuilder singleExecutionSchedule(int delayInSeconds) {
        return SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(delayInSeconds)
                .withRepeatCount(0);
    }

    /**
     * 创建一个简单的触发器，无限次数地重复，间隔时间为指定的秒数
     * @param intervalInSeconds 重复调度间隔时间（单位：秒）
     * @return
     */
    public static SimpleScheduleBuilder infiniteSimpleSchedule(int intervalInSeconds) {
        return SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(intervalInSeconds)
                .repeatForever();
    }

    /**
     * 创建一个简单的触发器，无限次数地重复，间隔时间为指定的分钟数
     * @param intervalInMinutes 重复调度间隔时间（单位：分钟）
     * @return
     */
    public static SimpleScheduleBuilder infiniteSimpleScheduleInMinutes(int intervalInMinutes) {
        return SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInMinutes(intervalInMinutes)
                .repeatForever();
    }

    /**
     *  创建一个简单的触发器，无限次数地重复，间隔时间为指定的小时数
     * @param intervalInHours 重复调度间隔时间（单位：小时）
     * @return
     */
    public static SimpleScheduleBuilder infiniteSimpleScheduleInHours(int intervalInHours) {
        return SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInHours(intervalInHours)
                .repeatForever();
    }

    /**
     * 哑火策略
     * 详细介绍参考资料：https://www.cnblogs.com/yaopengfei/p/8549508.html
     * @param simpleSchedule
     * @param misfireInstruction
     */
    private static void misfirePolicy(SimpleScheduleBuilder simpleSchedule, int misfireInstruction){
        if(misfireInstruction == SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW){
            simpleSchedule.withMisfireHandlingInstructionFireNow();
        } else if (misfireInstruction == SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT){
            simpleSchedule.withMisfireHandlingInstructionNowWithExistingCount();
        } else if (misfireInstruction == SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT){
            simpleSchedule.withMisfireHandlingInstructionNowWithRemainingCount();
        } else if (misfireInstruction == SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT){
            simpleSchedule.withMisfireHandlingInstructionNextWithRemainingCount();
        } else if (misfireInstruction == SimpleTrigger.MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT){
            simpleSchedule.withMisfireHandlingInstructionNextWithExistingCount();
        } else if (misfireInstruction == SimpleTrigger.MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY){
            simpleSchedule.withMisfireHandlingInstructionIgnoreMisfires();
        }
    }

}
